import { UnorderedSet } from "./UnorderedSet";

export class TVertex {
    //顶点标识。
    public label: number;
    //边集。
    public eset: UnorderedSet<number>;
    //三角形集。
    public tset: UnorderedSet<number>;

    /**
     * 构造函数。
     */
    public constructor(label?: number) {
        this.label = (label !== undefined) ? label : -1;
        this.eset = new UnorderedSet<number>();
        this.tset = new UnorderedSet<number>();
    }

    /**
     * 赋值函数。
     * @param vertex 顶点
     */
    public asign(vertex: TVertex): TVertex {
        this.label = vertex.label;
        this.eset.assign(vertex.eset);
        this.tset.assign(vertex.tset);
        return this;
    }

    /**
     * 插入边。
     * 
     * @param e 边索引。
     */
    public insertEge(e: number): boolean {
        return this.eset.insert(e);
    }

    /**
     * 移除一条边。
     * 
     * @param e 边索引。
     */
    public removeEdge(e: number): boolean {
        return this.eset.remove(e);
    }

    /**
     * 插入三角形。
     * 
     * @param t 三角形索引。
     */
    public insertTriangle(tri: number): boolean {
        return this.tset.insert(tri);
    }

    /**
     * 移除三角形。
     * 
     * @param tri 三角形索引。
     */
    public removeTriangle(tri: number): boolean {
        return this.tset.remove(tri);
    }

    /**
     * 替换三角形。
     * 
     * @param told 旧索引。
     * @param tnew 新索引。
     */
    public replaceTriangle(told: number, tnew: number): boolean {
        var nt = this.tset.length;
        for (var i = 0; i < nt; i++) {
            if (this.tset.value[i] === told) {
                this.tset.value[i] = tnew;
                return true;
            }
        }
        return false;
    }

    /**
     * 替换边。
     * 
     * @param eold 旧边索引。
     * @param enew 新边索引。
     */
    public replaceEdge(eold: number, enew: number): boolean {
        var ne = this.eset.length;
        for (var i = 0; i < ne; i++) {
            if (this.eset.value[i] === eold) {
                this.eset.value[i] = enew;
                return true;
            }
        }
        return false;
    }

}